package logger

import (
	"os"
	"path/filepath"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"

	"Data-API-MCP/backend/configs"
)

var (
	Log *zap.Logger
)

// InitLogger 初始化日志系统
func InitLogger(config *configs.Config) error {
	var core zapcore.Core

	// 创建日志目录
	if config.Log.Output == "file" {
		if err := os.MkdirAll(filepath.Dir(config.Log.FilePath), 0755); err != nil {
			return err
		}
	}

	// 设置日志级别
	level := zap.InfoLevel
	if err := level.UnmarshalText([]byte(config.Log.Level)); err != nil {
		return err
	}

	// 配置编码器
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",                         // 时间键
		LevelKey:       "level",                        // 级别键
		NameKey:        "logger",                       // 日志器键
		CallerKey:      "caller",                       // 调用者键
		MessageKey:     "msg",                          // 消息键
		StacktraceKey:  "stacktrace",                   // 堆栈跟踪键
		LineEnding:     zapcore.DefaultLineEnding,      // 行结束符
		EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
		EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601时间编码器
		EncodeDuration: zapcore.SecondsDurationEncoder, // 秒级持续时间编码器
		EncodeCaller:   zapcore.ShortCallerEncoder,     // 短调用者编码器
	}

	// 根据配置选择输出方式
	if config.Log.Output == "file" {
		// 文件输出
		file, err := os.OpenFile(config.Log.FilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
		if err != nil {
			return err
		}

		// 创建文件写入器
		fileWriter := zapcore.AddSync(file)

		// 创建文件核心
		fileCore := zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig),
			fileWriter,
			level,
		)

		// 创建控制台核心
		consoleCore := zapcore.NewCore(
			zapcore.NewConsoleEncoder(encoderConfig),
			zapcore.AddSync(os.Stdout),
			level,
		)

		// 合并核心
		core = zapcore.NewTee(fileCore, consoleCore)
	} else {
		// 控制台输出
		core = zapcore.NewCore(
			zapcore.NewConsoleEncoder(encoderConfig),
			zapcore.AddSync(os.Stdout),
			level,
		)
	}

	// 创建Logger
	Log = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
	return nil
}

// Debug 输出Debug级别日志
func Debug(msg string, fields ...zap.Field) {
	Log.Debug(msg, fields...)
}

// Info 输出Info级别日志
func Info(msg string, fields ...zap.Field) {
	Log.Info(msg, fields...)
}

// Warn 输出Warn级别日志
func Warn(msg string, fields ...zap.Field) {
	Log.Warn(msg, fields...)
}

// Error 输出Error级别日志
func Error(msg string, fields ...zap.Field) {
	Log.Error(msg, fields...)
}

// Fatal 输出Fatal级别日志
func Fatal(msg string, fields ...zap.Field) {
	Log.Fatal(msg, fields...)
}

// With 创建带有字段的Logger
func With(fields ...zap.Field) *zap.Logger {
	return Log.With(fields...)
}
